package com.efuture.chaptersix

import java.io.File

/* @Description:Kotlin语言DSL学习
 * @Auther: zhaoshanshan
 * @Date: 2022/03/11/8:45 下午
 */
class Context(){
    val info = "我是DSL"
    val name = "zhaoshanshan"
    fun toast(str:String)=println("str的值为:$str")
}
// 其实apply5函数，就是DSL编程范式，定义输入输出等规则：
// 1.定义整个lambda规则标准，输入 必须是Context这个类，才有资格调用apply5函数，匿名函数里面持有it 和 this
// 2.定义整个lambda规则标准，输出 我们会始终返回Context本身，所以你可以链式调用
// 然后main函数就可以根据DSL编程方式标准规则，来写具体的实现，这就是DSL编程范式
private inline fun Context.myContext(lambda:Context.(String)->Unit):Context{
    lambda(this,"test")
    return this
}
inline fun File.myApplyTest(action:(String,String)->Unit):File{
    setReadable(true)
    setWritable(true)
    action(name, readLines()[0])
    return this
}

fun main() {
    //调用myContext方法
    var context = Context().myContext {
        toast(it)
        toast(name)
        toast(info)

    }
    println(context)

    File("src/main/test.txt").myApplyTest{
        fileName,data->
        println(fileName)
        println(data)
    }
}